<?php
	/**
	* 核心类
	* @author zhufu <zhufu159239@163.com>
	* @version 1.0
	* @date 2012-07-13 15:51:18
	*/
	class admincore extends cooperation{

		public static $adminmsg;   //管理员消息类
		public static $adminlogs;   //管理员日志类
		public static $admin;      //管理员类
		public static $comment;     //评论类

		//类名字
		private $obj_ary = array('adminmsg', 'admin', 'adminlogs', 'comment');

		/**
		* 构造函数
		*
		* @return void
		*/
		public function __construct() {

		}

		/**
		* 析构函数
		*
		* @return void
		*/
		public function __destruct() {

		}

		/**
		* 魔术方法获取类
		*
		* @author zhouqi 2012-7-16 PM 01:19:34
		* @param string $name  名称
		*/
		public function __get($name) {
			if(!in_array($name, $this->obj_ary)) {
				return;
			}

			if(!self::$$name) {
				self::$$name = new $name();
			}

			return self::$$name;
		}

		/**
		* 用于phped代码自动完成
		*
		*/
		private function auto_complete() {
			self::$adminmsg = new adminmsg();
			self::$adminlogs = new adminlogs();
			self::$admin = new admin();
			self::$comment = new comment();
		}


		/**
		* 写入数据库
		* @author <zhufu159239@163.com> 2012-07-13 16:05:44
		*
		* @param string $table      要操作的表名
		* @param array $data        要设置的数据
		* @param boolean $insert    是否为插入，true（默认）为插入，false为更新
		* @param string $wherestr   如果是更新，加上要更新筛选条件
		* @param int $base          数据库 key 值
		*/
		public function set_db($table, $data, $insert=true, $wherestr='', $base=0){
			F('_fields/'.$table,null);
			$data = check_keys($data, '', $table);
			if(!$data || empty($data) || !is_array($data)){
				//没有有效值
				return false;
			}

			if($insert){
				//插入
				foreach($data as $k=>$v){
					$keys .= '`' . $k . '`,';
					$vals .= "'{$v}',";
				}
				$keys = trim($keys, ',');
				$vals = trim($vals, ',');
				$sql = "insert into {$table} ({$keys}) values ({$vals})";
				
				return $this->_mysql($base)->insert($sql);
			}

			if(!$wherestr){
				//没有where，且没有id作为默认的where,返回false
				return false;
			}
			//主键不能修改
			$format_array = F("_fields/{$table}");

			if(isset($data[$format_array['_pk']])){
				//不能更新 主键
				unset($data[$format_array['_pk']]);
			}

			$str = '';
			foreach($data as $k=>$v){
				$str .= "`{$k}`='{$v}',";
			}
			$str = trim($str, ',');
			$sql = "update {$table} set {$str} where 1";

			if($wherestr) {
				$sql .= " AND {$wherestr}";
			}

			return $this->_mysql($base)->query($sql, true);
		}

		/**
		* 自动表单验证
		* @author zhufu 2013-08-24
		*
		* @param string $modelname 模块名称
		*/
		public function auto_check($modelname){
			if(!$modelname){
				$modelname = get_class($this);
			}

			//得到模块的主键
			$table = 'my_' . $modelname;
			$cachefile = "_fields/{$table}";
			$format_array = F($cachefile);
			if(!$format_array) {
				$format_array = $this->_mysql(0)->flush($table);
				F($cachefile, $format_array);
			}
			//得到主键
			$pk = $format_array['_pk'];
			//得到模块表单配置
			$modelfile = $this->_root() . "/model/{$modelname}.php";
			$config = require $modelfile;
			//没有配置，说明是默认
			if(!$config || !$config['_autocheck']){
				return true;
			}
			if(isset($_GET[$pk])){
				$pk_val = $_GET[$pk];
			}

			foreach($config['_autocheck'] as $k=>$v){
				if($v[4] == 1 && $pk_val){
					//新增数据时验证,但主键有值，则不进行检查
					continue;
				}
				if($v[4] == 2 && !$pk_val){
					//编辑数据时，但没有主键
					continue;
				}
				$value = $_GET[$k];
				//处理附加规则
				if($v[3]){
					switch($v[3]){
						case 'length':
							$min = $v[0][0];
							$max = $v[0][1];
							$len = character_length_ch($value);
							if($len < $min || ($max && $len > $max)){
								return $v[1];
							}
							break;
						case 'between':
							$min = $v[0][0];
							$max = $v[0][1];
							if($min && $value < $min){
								return $v[1];
							}
							if($max && $value > $max){
								return $v[1];
							}
							break;
					}
				}
				else{
					if(!$v[2] && !isset($value)){
						continue;
					}
					if($v[2]==2 && !$value){
						continue;
					}
					switch($v[0]){
						case 'require':
							if(!$value){
								return $v[1];
							}
							break;
						case 'number':
							if(!is_numeric($value)){
								return $v[1];
							}
							break;
					}
				}
			}
			return true;
		}



		/**
		* 内部使用用户信息加密
		* @author <zhufu159239@163.com> 2012-07-19 13:31:56
		*
		* @param array $row
		*/
		public function userinfo_encode($row){
			$tmp = serialize($row);
			$tmp = base64_encode($tmp);
			$count = strlen($tmp);
			$result = '';
			for($i=0;$i<$count;$i+=4){
				$result .= substr($tmp, $i, 4) . rand(0, 9);
			}
			return $result;
		}

		/**
		* 内部使用用户信息解密
		* @author <zhufu159239@163.com> 2012-07-19 13:41:18
		*
		* @param string $str
		* @return array
		*/
		protected function userinfo_decode($str){
			$count = strlen($str);
			$result = '';
			for($i=0;$i<$count;$i+=5){
				$result .= substr($str, $i, 4);
			}
			$result = base64_decode($result);
			return unserialize($result);
		}


		/**
		* 得到分类列表
		* @author <zhufu159239@163.com> 2012-07-18 14:39:02
		*
		* @param string $table  分类列名
		* @param int $base      数据库
		* @return array
		*/
		public function cat_list($table, $base=0, $param=false){
			//缓存文件名
			$filename = "cat/{$table}";
			$cache = F($filename);
			if(!$cache){
				$sql = "SELECT * FROM {$table}";
				if($param && $param['sort']){
					$sql .= " ORDER BY `pid` ASC, `sort` {$param['sort']}";
				}else{
					$sql .= " ORDER BY`pid` ASC, `sort` ASC";
				}
				$list = $this->_mysql($base)->find($sql);
				if(!$list){
					return false;
				}
				$cache = array();
				foreach($list as $k=>$v){
					if($v['pid'] == 0){
						$cache[$v['id']] = $v;
					}else{
						if(!$cache[$v['pid']]['child']){
							$cache[$v['pid']]['child'] = array();
						}
						$cache[$v['pid']]['child'][] = $v;
					}
				}
				F($filename, $cache);
			}
			return $cache;
		}


		/**
		* 调用用户缓存API
		*
		* @author zhouqi 2012-6-12 PM 14:04:36
		* @param string $action    动作
		* @param string $path  路径
		* @param string $rtn   返回值
		* @param string $model 模块
		*/
		public function cache_api($action, $path, $rtn = 'json', $model = 'user') {
			global $_site;
			if(!$action || !$path) {
				return false;
			}

			if(!$this->user_cache_host) {
				$_config = $this->_config();
				$this->user_cache_host = $_config['cache_user']['host'];
				$this->user_cache_port = $_config['cache_user']['port'];
			}

			//进行接口登陆
			$result = dfopen("http://{$this->user_cache_host}:{$this->user_cache_port}/?model={$model}&action={$action}&format={$rtn}&{$path}" );
			if($rtn == 'json') {
				$result = str_replace(array("\n", "\r"), '', $result);
				$result = json_decode($result, true);
				$result = array_pop($result);
				$result['state'] = $result['state'] == 'true' ? true : false;
				return $result;
			}

		}

		/**
		* 保存图片
		* @author limin  2013-07-01  PM 19:48:00
		* @param string $var 表单名
		* @param string $item 登记上传图片时的项目id
		*
		*/
		public function save_img($var='img',$item='image',$name=''){
			global $_site;
			//如果是post提交
			$size = $_site->site_config['site']['upload_pic_size'] * 1024 * 1024;
			$path = "/{$_site->site_config['site']['upload_dir']}/{$item}/" . date('Ymd/');
			if(empty($name)){
			   $name = time() . rand(1000,9999);
			}
			$result = $_site->_file()->upload_file($var, $_site->_root() . $path, $size, true, $name);
			if(!$result){
				return false;

			}
			return $result;
		}


		/**
		* memcache设置和读取方法
		* @author zhufu 2013-10-14
		*
		* @param string $key 键
		* @param mixed $value 值，默认为 '',表示读取，有值的字符串为设置值，false 为清除
		* @param int $expire 过期时间，默认为0 不过期
		*/
		public function memcache($key, $value='', $expire=0){
			//检查是否开启了 Memcache
			$config = $this->_config();
			if(!$config['memcache'] || !$config['memcache']['valid']){
				return false;
			}

			if(!$key){
				return false;
			}
			//键值处理
			$key = md5($key);

			if($value === false){
				return $this->_memcache()->_del($key);
			}
			else if($value){
				return $this->_memcache()->_set($key, $value, $expire);
			}
			else{
				$result = $this->_memcache()->_get($key);
				return $result[0];
			}
		}

		
		/**
		* 接口日志写入文件
		* @author zhufu 2013-07-24
		* $delFlag 是否删除api。text
		* @param mixed $ctn
		*/
		public function api_logs($ctn,$delFlag=false){
			if(is_array($ctn)){
				$ctn = var_export($ctn, true);
			}
			if(!$ctn){
				return false;
			}
			$logsfile = $this->_root() . '/data/logs/api.txt';
			if($delFlag===true){
				unlink($logsfile);
			}
			$fp = @fopen($logsfile, 'a+');
			$ctn = "=============================\r\n" . $ctn ."\r\n";
			@fwrite($fp, $ctn);
		}
		
		/**
		 * 记录上传文件原始数据的日志
		 */
		public function recordlog($ctn,$filename='_api.txt'){			
			$logsfile = $this->_root() . '/data/logs/'.date('Ymd').$filename;
			$fp = @fopen($logsfile, 'a+');
			$ctn = "=============================\r\n" . $ctn ."\r\n";
			@fwrite($fp, $ctn);
		}		

	}

?>
